import geometry.Geometry;
import grammar.Design;

import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.util.List;
import java.util.Random;

import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import javax.media.j3d.*;
import javax.swing.JInternalFrame;
import javax.vecmath.*;


//   MouseNavigatorApp renders a single, interactively rotatable,

//   traslatable, and zoomable ColorCube object.


@SuppressWarnings("all")
public class GeomFrame extends JInternalFrame {
  static int openFrameCount = 0;
  static final int xOffset = 30, yOffset = 30;
  static private Design design;

  
  TransformGroup translate(Node node,Vector3f vector){

      Transform3D transform3D = new Transform3D();
      transform3D.setTranslation(vector);
      TransformGroup transformGroup = new TransformGroup();
      transformGroup.setTransform(transform3D);
      transformGroup.addChild(node);
      return transformGroup;
  }//end translate

  
    public BranchGroup createSceneGraph(SimpleUniverse su) {

    // Create the root of the branch graph

    BranchGroup objRoot = new BranchGroup();

        TransformGroup vpTrans = null;

        BoundingSphere mouseBounds = null;
        
        vpTrans = su.getViewingPlatform().getViewPlatformTransform();

        objRoot.addChild(new Axis());  
        
        Random rand = new Random();
        for (Geometry geom : design.getGeometries()) {
            List<Node> nodeList = geom.getTransormedJava3DBox(rand.nextFloat(),rand.nextFloat(),rand.nextFloat(), 50);
            for (Node node : nodeList) {
                objRoot.addChild(node);
            }
        }        
        
        mouseBounds = new BoundingSphere(new Point3d(), 10000.0);

        MouseRotate myMouseRotate = new MouseRotate();//MouseRotate myMouseRotate = new MouseRotate(MouseBehavior.INVERT_INPUT);
        //myMouseRotate.setFactor(-250);
        myMouseRotate.setTransformGroup(vpTrans);
        myMouseRotate.setSchedulingBounds(mouseBounds);
        objRoot.addChild(myMouseRotate);

        MouseTranslate myMouseTranslate = new MouseTranslate(MouseBehavior.INVERT_INPUT);
        myMouseTranslate.setTransformGroup(vpTrans);
        myMouseTranslate.setSchedulingBounds(mouseBounds);
        objRoot.addChild(myMouseTranslate);

        MouseZoom myMouseZoom = new MouseZoom(MouseBehavior.INVERT_INPUT);
        myMouseZoom.setTransformGroup(vpTrans);
        myMouseZoom.setSchedulingBounds(mouseBounds);
        objRoot.addChild(myMouseZoom);

    // Let Java 3D perform optimizations on this scene graph.

        objRoot.compile();



    return objRoot;

    } // end of CreateSceneGraph method of MouseNavigatorApp



    // Create a simple scene and attach it to the virtual universe



    public GeomFrame(Design design) {
        
        super("GEOMETRY", 
                true, //resizable
                true, //closable
                true, //maximizable
                true);//iconifiable
        this.design = design;
        //...Create the GUI and put it in the window...

        //...Then set the window size or call pack...
        setSize(1200,900);

        //Set the window's location.
        setLocation(600, 10);

        setLayout(new BorderLayout());

        GraphicsConfiguration config =

           SimpleUniverse.getPreferredConfiguration();



        Canvas3D canvas3D = new Canvas3D(config);

        add("Center", canvas3D);



        // SimpleUniverse is a Convenience Utility class

        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);



        BranchGroup scene = createSceneGraph(simpleU);



    // This will move the ViewPlatform back a bit so the

    // objects in the scene can be viewed.

        simpleU.getViewingPlatform().setNominalViewingTransform();



        simpleU.addBranchGraph(scene);

    } // end of MouseNavigatorApp (constructor)

    //  The following allows this to be run as an application

    //  as well as an applet



//    public static void main(String[] args) {
//
//        System.out.print("MouseNavigatorApp.java \n- a demonstration of using the mouse ");
//
//        System.out.println("behavior utility classes to provide navigational interaction in a Java 3D scene.");
//
//        System.out.println("Hold the mouse button while moving the mouse to move.");
//
//        System.out.println("     left mouse button      - rotate");
//
//        System.out.println("     right mouse button     - translate");
//
//        System.out.println("     Alt+left mouse button  - zoom");
//
//        System.out.println("This is a simple example progam from The Java 3D API Tutorial.");
//
//        System.out.println("The Java 3D Tutorial is available on the web at:");
//
//        System.out.println("http://java.sun.com/products/java-media/3D/collateral");
//
//        Frame frame = new MainFrame(new GeomFrame(), 256, 256);
//
//    } // end of main (method of MouseNavigatorApp)



} // end of class MouseNavigatorApp



//import com.sun.j3d.utils.universe.SimpleUniverse;
//import com.sun.j3d.utils.geometry.ColorCube;
//import javax.media.j3d.BranchGroup;
//import javax.media.j3d.Canvas3D;
//import javax.swing.JInternalFrame;
//
//import java.awt.GraphicsConfiguration;
//import java.awt.BorderLayout;
//import java.awt.Label;
//import java.applet.Applet;
//import com.sun.j3d.utils.applet.MainFrame;
//
//public class GeomFrame extends JInternalFrame {
//    static int openFrameCount = 0;
//    static final int xOffset = 30, yOffset = 30;
//
//
//    public GeomFrame()  { 
//        super("GRAPH", 
//                true, //resizable
//                true, //closable
//                true, //maximizable
//                true);//iconifiable
//
//        //...Create the GUI and put it in the window...
//
//        //...Then set the window size or call pack...
//        setSize(300,300);
//
//        //Set the window's location.
//        setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
//
//        setLayout(new BorderLayout());
//        GraphicsConfiguration config = 
//            SimpleUniverse.getPreferredConfiguration();
//        Canvas3D canvas = new Canvas3D(config);  
//        add("North",new Label("This is the top"));
//        add("Center", canvas);
//        add("South",new Label("This is the bottom"));
//        BranchGroup contents = new BranchGroup();
//        contents.addChild(new ColorCube(0.3));
//        SimpleUniverse universe = new SimpleUniverse(canvas);
//        universe.getViewingPlatform().setNominalViewingTransform();
//        universe.addBranchGraph(contents);   
//    }
//}
